package main
import (
	"fmt"
)

type Usb interface{
	// 声明两个没有实现的方法
	Start()
	Stop()
}

type Phone struct{
	name string
}

func (p Phone)Start()  {
	fmt.Println("phone start working=",p.name)
}

func (p Phone)Stop()  {
	fmt.Println("phone stop working=",p.name)
}


func(p Phone)Call(){
	fmt.Println("phone call=",p.name)
}

type Camera struct{
	name string
}

func (p Camera)Start()  {
	fmt.Println("camera start working=",p.name)
}

func (p Camera)Stop()  {
	fmt.Println("camera stop working=",p.name)
}

type Copmuter struct{

}
func (c Copmuter) Working(usb Usb)  {
	usb.Start()
	// 如果usb 是指Phone 的结构体变量，则调用call
	if p,ok :=usb.(Phone);ok{
		p.Call()
	}
	usb.Stop()
}

func main(){
	// 定义一个一个Usb接口数组,可以存放Phone 和Camera 的结构体变量
	// 这里就体现出多态数组
	var usbArr [3]Usb
	usbArr[0] = Phone{"vivo"}
	usbArr[1] = Phone{"小米"}
	usbArr[2] = Camera{"尼康"}

	// 遍历usbArr
	//Phone 还有一个特有的方法call(),请遍历Usb数组，如果是Phone变量，
	// 除了调用Usb 接口声明的方法外，还需要调用Phone 特有的方法
	var c Copmuter 
	for _,v :=range usbArr{
		c.Working(v)
		fmt.Println()
	}


}